library(arules)
trans <- read.transactions('data.csv', , format = 'basket', sep=',')
dim (trans)
## [1] 7501 119
Wir haben 7501 transaction data und 119 distinct items.
itemLabels(trans)
## [1] "almonds" "antioxydant juice" "asparagus"
## [4] "avocado" "babies food" "bacon"
## [7] "barbecue sauce" "black tea" "blueberries"
## [10] "body spray" "bramble" "brownies"
## [13] "bug spray" "burger sauce" "burgers"
## [16] "butter" "cake" "candy bars"
## [19] "carrots" "cauliflower" "cereals"
## [22] "champagne" "chicken" "chili"
## [25] "chocolate" "chocolate bread" "chutney"
## [28] "cider" "clothes accessories" "cookies"
## [31] "cooking oil" "corn" "cottage cheese"
## [34] "cream" "dessert wine" "eggplant"
## [37] "eggs" "energy bar" "energy drink"
## [40] "escalope" "extra dark chocolate" "flax seed"
## [43] "french fries" "french wine" "fresh bread"
## [46] "fresh tuna" "fromage blanc" "frozen smoothie"
## [49] "frozen vegetables" "gluten free bar" "grated cheese"
## [52] "green beans" "green grapes" "green tea"
## [55] "ground beef" "gums" "ham"
## [58] "hand protein bar" "herb & pepper" "honey"
## [61] "hot dogs" "ketchup" "light cream"
## [64] "light mayo" "low fat yogurt" "magazines"
## [67] "mashed potato" "mayonnaise" "meatballs"
## [70] "melons" "milk" "mineral water"
## [73] "mint" "mint green tea" "muffins"
## [76] "mushroom cream sauce" "napkins" "nonfat milk"
## [79] "oatmeal" "oil" "olive oil"
## [82] "pancakes" "parmesan cheese" "pasta"
## [85] "pepper" "pet food" "pickles"
## [88] "protein bar" "red wine" "rice"
## [91] "salad" "salmon" "salt"
## [94] "sandwich" "shallot" "shampoo"
## [97] "shrimp" "soda" "soup"
## [100] "spaghetti" "sparkling water" "spinach"
## [103] "strawberries" "strong cheese" "tea"
## [106] "tomato juice" "tomato sauce" "tomatoes"
## [109] "toothpaste" "turkey" "vegetables mix"
## [112] "water spray" "white wine" "whole weat flour"
## [115] "whole wheat pasta" "whole wheat rice" "yams"
## [118] "yogurt cake" "zucchini"
summary(trans)
## transactions as itemMatrix in sparse format with
## 7501 rows (elements/itemsets/transactions) and
## 119 columns (items) and a density of 0.03288973
##
## most frequent items:
## mineral water eggs spaghetti french fries chocolate
## 1788 1348 1306 1282 1229
## (Other)
## 22405
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## 1754 1358 1044 816 667 493 391 324 259 139 102 67 40 22 17 4
## 18 19 20
## 1 2 1
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 3.914 5.000 20.000
##
## includes extended item information - examples:
## labels
## 1 almonds
## 2 antioxydant juice
## 3 asparagus
###1 Density: 0.03288973 -> 3,2% Gibt den Prozentsatz an, wie viele nicht-Null Zellen in der Matrix vorhanden sind. ###2 Set mit 1 Item in 1754 Transactions. Dies Bedeutet dass 1754 Transaktionen lediglich 1 Artikel beinhaltet. ###3 Auch Oberes Quartil genannt. Zeigt wie die ersten 75% der Daten abschneiden. In den ersten 75% der Daten wurden in 667 Transaktionen ein Itemset von 5 Produkten gekauft
itemFrequencyPlot(trans, topN=3, cex.names=1)
Eier und Spaghetti haben eine ähnliche “relative item frequency” mit ca. 17% während es bei Mineralwasser bei mehr als 20% liegt.
library(arulesViz)
rules <- apriori(trans,
parameter = list(supp=0.01, conf=0.2,
maxlen=10,
target= "rules"))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.2 0.1 1 none FALSE TRUE 5 0.01 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 75
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[119 item(s), 7501 transaction(s)] done [0.00s].
## sorting and recoding items ... [75 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 done [0.00s].
## writing ... [164 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
summary(rules)
## set of 164 rules
##
## rule length distribution (lhs + rhs):sizes
## 1 2 3
## 1 116 47
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 2.00 2.00 2.28 3.00 3.00
##
## summary of quality measures:
## support confidence coverage lift
## Min. :0.01013 Min. :0.2000 Min. :0.02000 Min. :0.9025
## 1st Qu.:0.01293 1st Qu.:0.2285 1st Qu.:0.04786 1st Qu.:1.3483
## Median :0.01646 Median :0.2654 Median :0.05999 Median :1.5718
## Mean :0.02143 Mean :0.2878 Mean :0.08108 Mean :1.6333
## 3rd Qu.:0.02306 3rd Qu.:0.3310 3rd Qu.:0.09505 3rd Qu.:1.8436
## Max. :0.23837 Max. :0.5067 Max. :1.00000 Max. :3.2920
## count
## Min. : 76.0
## 1st Qu.: 97.0
## Median : 123.5
## Mean : 160.7
## 3rd Qu.: 173.0
## Max. :1788.0
##
## mining info:
## data ntransactions support confidence
## trans 7501 0.01 0.2
##b Support: Wie beliebt ist eine Menge von Elementen, gemessen am Anteil der Transaktionen, in denen das Itemset erscheint. Es lässt sich berechnen indem man die Häufigkeit von A durch die Anzahl aller Transaktionen teilt. Normalerweise wird dabei noch ein Schwellenwert gesetzt, um die Anzahl der zu analysierenden Itemsets zu verringern.
Confidence: Wie wahrscheinlich ist es, dass Produkt B gekauft wird wenn Produkt A gekauft wurde. Es wird berechnet indem man support(A∪B) durch den support(A) teilt. Confidence gibt jedoch nur an, wie beliebt das Produkt A ist, nicht jedoch Produkt B. Wenn jedoch Produkt A sehr beliebt ist (confidence hoch) ist es wahrscheinlicher, dass Produkt B ebenfalls im Warenkorb landet.
##c 1. set of rules: 164 2. 1, 116, 47 3. Median :0.01646, Median :0.2654, Median :1.5718
##d Lift:
Wie wahrscheinlich ist es, dass Artikel B gekauft wird, wenn Artikel A gekauft wird. Gleichzeitig wird gemessen, wie beliebt Artikel A und B sind -> es wird gemessen, wie oft A und B häufiger zusammen auftreten als erwartet, wenn sie statistisch unabhängig sind. Lift wird berechtnet indem man support(A∪B) durch support(A)×support(B) teilt. Bei Lift gibt es 3 verschieden Szenarien: lift=1: keine Assoziationen lift<1:B wird wahrscheinlich nicht gekauft wenn A gekauft wurde lift>1:B wird wahrscheinlich gekauft wenn A gekauft wurde
water_rules_rhs <- apriori(trans,
parameter = list(supp=0.01, conf=0.5,
maxlen=10,
minlen=2),
appearance = list(default="lhs", rhs="mineral water"))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.01 2
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 75
##
## set item appearances ...[1 item(s)] done [0.00s].
## set transactions ...[119 item(s), 7501 transaction(s)] done [0.00s].
## sorting and recoding items ... [75 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 done [0.00s].
## writing ... [2 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
inspect(water_rules_rhs)
## lhs rhs support confidence coverage
## [1] {ground beef,milk} => {mineral water} 0.01106519 0.5030303 0.02199707
## [2] {eggs,ground beef} => {mineral water} 0.01013198 0.5066667 0.01999733
## lift count
## [1] 2.110308 83
## [2] 2.125563 76
LHS: Erst Hackfleisch und dann Milch bei der ersten Regel und bei der zweiten erst Eier und dann Hackfleisch RHS: Beides mal Mineralwasser Support: 1,1% der Kunden haben entweder nach einem Einkauf von Hackfleisch und milch oder Eier und Hackfleisch Mineralwasser gekauft Confidence: Beide Regeln treten mit einer wahrscheinlichkeit von 50% ein. Die zweite Regel ein bisschen wahrscheinlicher als die Erste Lift: liegt beides mal bei >1 sodass beides mal es ehr wahrscheinlich ist, dass nach dem kauf von Hackfleisch und milch oder Eier und Hackfleisch mineralwasser gekauft wird
Coverage: ist ein Faktor, wie oft die Regel auf der Linken Seite (LHS) der allgemeinen Regel angewendet werden kann 2,2% rule 1 2,0% rule 2
eggs_rules_lhs <- apriori(trans,
parameter = list(supp=0.01, conf=0.2,
maxlen=10,
minlen=2),
appearance = list(default="rhs", lhs="eggs"))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.2 0.1 1 none FALSE TRUE 5 0.01 2
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 75
##
## set item appearances ...[1 item(s)] done [0.00s].
## set transactions ...[119 item(s), 7501 transaction(s)] done [0.00s].
## sorting and recoding items ... [75 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 done [0.00s].
## writing ... [3 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
inspect(eggs_rules_lhs)
## lhs rhs support confidence coverage lift count
## [1] {eggs} => {french fries} 0.03639515 0.2025223 0.1797094 1.184961 273
## [2] {eggs} => {spaghetti} 0.03652846 0.2032641 0.1797094 1.167446 274
## [3] {eggs} => {mineral water} 0.05092654 0.2833828 0.1797094 1.188845 382
erst eier und dann Pommes support:0.03639515 die Regel haben 3,6% der Kunden eingehalten confidence: 0.2025223 die Regel tritt mit einer wahrscheinlichekti von 20% ein coverage: 0.1797094 17% der Kunden kaufen eier lift: 1.184961 liegt >1 sodass es wahrscheinlich ist dass es zusammen gekauft wird
##j Damit man mehr Pommes nach Eiern kauft könne man die Eier strategisch neben den Tiefkühlprodukten lagern und die Pommes in der Tiefkühltruhe nahe an den Eiern platzieren. So fällt den Kunden eher ein, dass sie wenn sie Eier kaufen auch noch Pommes brauchen könnten Man könnte neben den Eiern eine Rezeptempfehlung für z.B. Spaghetti Carbonara aufhängen. So könnten die Kunden darauf Lust bekommen und kaufen nachdem sie Eier genommen haben noch Spaghetti dazu. Man könnte einen Wasserspender (wie bei DM) neben die Eier platzieren, sodass den Kunden auffällt dass sie noch Mineralwasser kaufen müssen. Wenn der Kunde das Produkt sieht, fällt ihm oft ein, was er noch braucht auch wenn es nicht auf seiner Liste steht.
plot(rules, engine = "plotly")
###b 1){} ->{mineral water} 2){eggs, ground beef}->{mineral water} 3){herb & pepper}->{ground beef}
subrules <- head(rules, n = 5, by = "lift")
plot(subrules, method = "graph", engine = "htmlwidget")
###b {herb & pepper}->{ground beef} Die stärkste Regel besitzt einen Support von 1,6% und eine Confidence von 32,3%. LIft liegt bei 3.29 und ist somit größer als 1 und bestätigt die Wahrscheinlichkeit der Regel. support = 0.016 confidence = 0.323 coverage = 0.0495 lift = 3.29 count = 120 order = 2
{mineral water, spaghetti}->{ground beef} Die zweitstärkste Regel besitzt einen Support von 1,7% und eine Confidence von 5,9%. Lift liegt bei 2,91 und ist somit ebenfalls größer als 1 und bestätigt die Wahrscheinlichkeit der Regel. support = 0.0171 confidence = 0.286 coverage = 0.0597 lift = 2.91 count = 128 order = 3
plot(subrules, method="paracoord")
###b {herb & pepper}->{ground beef} {mineral water, spaghetti}->{ground beef} Man kann wenig ablesen, auser in welcher Reihenfolge die LHS in den Warenkorb kommen, bevor RHS dazu kommt. Man erkennt ledgiglich an der Farbe, welche Regeln die stärksten sind.